3

Android 4.2 で HttpPost に問題があります。.NET WebAPI サービスでホストされている認証サービスを呼び出そうとしています。

このサービスでは、リクエストが POST メソッドとして作成され、いくつかのカスタム リクエスト ヘッダーが提供される必要があります。リクエストの本文は、Json 値をサービスに送信します。

リクエストの作成方法は次のとおりです。

HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost("http://api.fekke.com/api/account/login");
httppost.addHeader(HTTP.TARGET_HOST, "api.fekke.com");
httppost.addHeader("Accept", "application/json");
httppost.addHeader("Fekke-AccessKey", "some-access-key");
httppost.addHeader("Date", dateString);
httppost.addHeader("Fekke-Signature", "some-encoded-value");
httppost.addHeader("Content-Type", "application/json; charset=utf-8");

String jsonmessage = "{\"Username\": \"myusername\", \"Password\": \"mypassword987\"}";
httppost.setEntity(new StringEntity(jsonmessage, HTTP.UTF_8));

HttpResponse response = httpclient.execute(httppost);

「Content-Length」ヘッダーでこれを呼び出そうとしましたが、ヘッダーがリクエストに既に存在するという例外がスローされます。

また、Google がこの時点から使用することを提案している HttpURLConnection オブジェクトを使用してこれを呼び出してみましたが、これも同じ問題に遭遇します。

iOS と .NET から問題なくこのリクエストを呼び出すことができたので、サービスではないことがわかりました。

更新 #1

サービスのローカル バージョンで次の例を実行したところ、http ヘッダーの 1 つでハッシュ値を渡すときにエラーを特定できました。サービスで使用される値を設定するために HMAC SHA-256 ハッシュ アルゴリズムを使用する JWT セキュリティ トークンを使用しています。このハッシュ値により、リクエストの実行が失敗します。

更新 #2

私はついに問題を解決することができました。この問題は、Base64 の encodeToString メソッドが非表示の文字を値に追加したことが原因でした。ヘッダーの破損を強制していました。デフォルト設定の 0 または Base64.DEFAULT を使用していました。値を Base64.NO_WRAP に変更したところ、問題は解決しました。

4

1 に答える 1

0

正しい方法を使用している場合、投稿に 'content-length' ヘッダーを設定することについて心配する必要はありません。Post では、通常、「SetEntity($Type-stream/string/encodedArray...)」のオーバーロード バージョンを使用します。

このソース( 長さで検索 ) を見て、API が投稿の長さを処理する方法の例を確認してください。

http に使用するライブラリを評価し、「setEntity」などのメソッドを示す POST の例を見つけて、投稿の本文を設定する必要があります。そうすれば、コンテンツの長さに関連するエラーは発生しません。を見る

サンプルコード「HttpConnection」クラス - 私のコメントからのリンクを使用...

JSON またはビットマップの場合:

try {                       
    HttpResponse response = null;
    switch (method) {
    case GET:
        HttpGet httpGet = new HttpGet(url);             
        response = httpClient.execute(httpGet);
        break;
    //Note on NIO - using a FileChannel and  mappedByteBuffer may be NO Faster
    // than using std httpcore  http.entity.FileEntity
    case POST:
        //TODO bmp to stream to bytearray for data entity
        HttpPost httpPost = new HttpPost(url); //urlends "audio OR "pic" 
        if (  !url.contains("class") ){                 
            ByteArrayOutputStream stream = new ByteArrayOutputStream();
            //can alter belo for smaller uploads to parse .JPG , 40,strm
            bmp.compress(Bitmap.CompressFormat.PNG, 100, stream);               
            httpPost.setEntity(new ByteArrayEntity(stream.toByteArray()));

        }else if(data != null && (url.contains("class"))){
            //bug data is blank
            httpPost.setEntity(new StringEntity(data));
            Log.d(TAG, "DATA in POST run-setup " +data);
        }

        response = httpClient.execute(httpPost);
        break;
    case PUT:
        HttpPut httpPut = new HttpPut(url);
        httpPut.setEntity(new StringEntity(data));
        response = httpClient.execute(httpPut);
        break;
    case DELETE:
        response = httpClient.execute(new HttpDelete(url));
        break;
    case BITMAP:
        response = httpClient.execute(new HttpGet(url));
        processBitmapEntity(response.getEntity());
        break;
    }
    if (method < BITMAP)
        processEntity(response.getEntity());
} catch (Exception e) {
    handler.sendMessage(Message.obtain(handler,
            HttpConnection.DID_ERROR, e));
}

Post の XML 本文の場合:

try {
    HttpResponse response = null;
    switch (method) {

    case POST:
        HttpPost httpPost = new HttpPost(url);
        if (data != null){
            System.out.println(" post data not null ");
            httpPost.setEntity(new StringEntity(data));
        }
        if (entry != null){
            ContentProducer cp = new ContentProducer() {
                public void writeTo(OutputStream outstream) throws IOException {

                     ExtensionProfile ep = new ExtensionProfile();
                     ep.addDeclarations(entry);
                     XmlWriter xmlWriter = new XmlWriter(new OutputStreamWriter(outstream, "UTF-8"));
                     entry.generate(xmlWriter, ep);
                     xmlWriter.flush();
                }
            };
            httpPost.setEntity(new EntityTemplate(cp));
        }
        httpPost.addHeader("GData-Version", "2");
        httpPost.addHeader("X-HTTP-Method-Override", "PATCH");
        httpPost.addHeader("If-Match", "*");
        httpPost.addHeader("Content-Type", "application/xml");
        response = httpClient.execute(httpPost);

        break;
    }
    if (method < BITMAP)
        processEntity(response.getEntity());
} catch (Exception e) {
    handler.sendMessage(Message.obtain(handler,
            HttpConnection.DID_ERROR, e));
}
于 2013-04-26T04:39:39.223 に答える