1. ホーム
  2. ios

[解決済み] iOS で HTTP POST リクエストを送信する

2023-05-20 05:53:31

質問

開発中のiOSアプリでHTTP Postを送信しようとしていますが、(urlconnectionから)応答としてコード200を得るものの、pushがサーバーに到達しません。サーバーからの応答もなく、サーバーが私の投稿を検出することもありません (サーバーはアンドロイドからの投稿を検出します)。

私はARCを使用していますが、pdとurlConnectionはstrongに設定されています。

これはリクエストを送信するための私のコードです。

 NSMutableURLRequest *request = [[NSMutableURLRequest alloc]
                                    initWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@%@",dk.baseURL,@"daantest"]]];
    [request setHTTPMethod:@"POST"];
    [request setValue:@"text/xml"
   forHTTPHeaderField:@"Content-type"];

    NSString *sendString = @"<data><item>Item 1</item><item>Item 2</item></data>";

    [request setValue:[NSString stringWithFormat:@"%d", [sendString length]] forHTTPHeaderField:@"Content-length"];

    [request setHTTPBody:[sendString dataUsingEncoding:NSUTF8StringEncoding]];
    PushDelegate *pushd = [[PushDelegate alloc] init];
    pd = pushd;
    urlConnection = [[NSURLConnection alloc] initWithRequest:request delegate:pd];
    [urlConnection start];

これは私のデリゲート用のコードです。

#import "PushDelegate.h"

@implementation PushDelegate
@synthesize data;

-(id) init
{
    if(self = [super init])
    {
        data = [[NSMutableData alloc]init];
        [data setLength:0];
    }
    return self;
}


- (void)connection:(NSURLConnection *)connection didWriteData:(long long)bytesWritten totalBytesWritten:(long long)totalBytesWritten
{
    NSLog(@"didwriteData push");
}
- (void)connectionDidResumeDownloading:(NSURLConnection *)connection totalBytesWritten:(long long)totalBytesWritten expectedTotalBytes:(long long)expectedTotalBytes
{
    NSLog(@"connectionDidResumeDownloading push");
}

- (void)connectionDidFinishDownloading:(NSURLConnection *)connection destinationURL:(NSURL *)destinationURL
{
    NSLog(@"didfinish push @push %@",data);
}

- (void)connection:(NSURLConnection *)connection didSendBodyData:(NSInteger)bytesWritten totalBytesWritten:(NSInteger)totalBytesWritten totalBytesExpectedToWrite:(NSInteger)totalBytesExpectedToWrite
{
    NSLog(@"did send body");
}

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
    [self.data setLength:0];
    NSHTTPURLResponse *resp= (NSHTTPURLResponse *) response;
    NSLog(@"got response with status @push %d",[resp statusCode]);
}

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)d
{
    [self.data appendData:d];

    NSLog(@"recieved data @push %@", data);
}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
    NSString *responseText = [[NSString alloc] initWithData:self.data encoding:NSUTF8StringEncoding];

    NSLog(@"didfinishLoading%@",responseText);

}

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
    [[[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Error ", @"")
                                message:[error localizedDescription]
                               delegate:nil
                      cancelButtonTitle:NSLocalizedString(@"OK", @"")
                      otherButtonTitles:nil] show];
    NSLog(@"failed &push");
}

// Handle basic authentication challenge if needed
- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
{
    NSLog(@"credentials requested");
    NSString *username = @"username";
    NSString *password = @"password";

    NSURLCredential *credential = [NSURLCredential credentialWithUser:username
                                                             password:password
                                                          persistence:NSURLCredentialPersistenceForSession];
    [[challenge sender] useCredential:credential forAuthenticationChallenge:challenge];
}

@end

コンソールは常に次の行と次の行だけを表示します。

2013-04-01 20:35:04.341 ApprenticeXM[3423:907] did send body
2013-04-01 20:35:04.481 ApprenticeXM[3423:907] got response with status @push 200
2013-04-01 20:35:04.484 ApprenticeXM[3423:907] didfinish push @push <>

どのように解決するのですか?

以下のコードでは、簡単な例として POST メソッドを使っています( によってデータを渡す方法 POST メソッド )

ここでは、POSTメソッドの使い方を説明します。

1. 投稿文字列に実際のユーザー名とパスワードを設定します。

NSString *post = [NSString stringWithFormat:@"Username=%@&Password=%@",@"username",@"password"]; 

2. 投稿文字列をエンコードするには NSASCIIStringEncoding でエンコードし、さらにNSData形式で送信する必要があるpost文字列を指定します。

NSData *postData = [post dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES]; 

実際のデータの長さを送信する必要があります。投稿文字列の長さを計算します。

NSString *postLength = [NSString stringWithFormat:@"%d",[postData length]]; 

3. のようなすべてのプロパティを持つUrlrequestを作成します。 HTTP メソッド、httpヘッダーフィールド、投稿文字列の長さなどのすべてのプロパティを含むUrlrequestを作成します。作成 URLRequest オブジェクトを作成し、それを初期化します。

NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init]; 

そのリクエストにデータを送信するUrlを設定します。

[request setURL:[NSURL URLWithString:@"http://www.abcde.com/xyz/login.aspx"]]; 

では HTTP メソッド ( POST または GET ). この行をそのままあなたのコードに書いてください。

[request setHTTPMethod:@"POST"]; 

設定 HTTP ヘッダーフィールドに投稿データの長さを設定します。

[request setValue:postLength forHTTPHeaderField:@"Content-Length"]; 

HTTPヘッダFieldのEncode値も設定します。

[request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];

を設定します。 HTTPBody をpostDataで設定します。

[request setHTTPBody:postData];

4. ここで、URLConnectionオブジェクトを作成します。これをURLRequestで初期化します。

NSURLConnection *conn = [[NSURLConnection alloc] initWithRequest:request delegate:self]; 

初期化されたurl接続を返し、urlリクエストのデータの読み込みを開始します。を実行したかどうかを確認することができます。 URL 接続が適切に行なわれているかどうかは if/else ステートメントを使用します。

if(conn) {
    NSLog(@"Connection Successful");
} else {
    NSLog(@"Connection could not be made");
}

5. HTTPリクエストからデータを受け取るには、URLConnectionクラスリファレンスで提供されているデリゲートメソッドを使用します。 デリゲートメソッドは以下の通りです。

// This method is used to receive the data which we get using post method.
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData*)data

// This method receives the error report in case of connection is not made to server. 
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error 

// This method is used to process the data after connection has made successfully.
- (void)connectionDidFinishLoading:(NSURLConnection *)connection

こちらもご覧ください これは これは ドキュメント に対して POST メソッドを使用します。

そして、最も良い例として、ソースコードに HTTPPostメソッドです。